/*******************************************************
> Copyright (C) 2024 ==IOT== All rights reserved.
> File Name: queue.cpp
> Author: IOT
> Website:www.slq.org
> Created Time: 2024年10月29日 星期二 11时08分14秒
***************************************************/

#include <iostream>
using namespace std;

template <class T>
class Queue {
	class Node {
		public:
		T val;
		Node *prev, *next;
	};
	Node *head; // 记录队首
	Node *tail;	// 记录队尾
	int len;    // 记录队列长度
	public:
		Queue() : head(nullptr), tail(nullptr), len(0)
		{}
		~Queue();
		
		inline bool empty() // 队列判空
		{
			return len == 0;
		}
		inline int size()
		{
			return len;
		}
		T& front()
		{
			return head->val; // 对指针没有判空，使用者需要通过empty判空
		}
		T& back()
		{
			return tail->val;
		}
		void push(const T& val); // 在队尾添加元素
		void pop();
};
// 函数功能：在队尾添加元素
template <class T>
void Queue<T>::pop()
{
	if (len == 0)
		return;
	
	Node *p = head;
	head = head->next;
	delete p;
	len--;
}

// 函数功能：在队尾添加元素
template <class T>
void Queue<T>::push(const T& val)
{
	Node *p = new Node;
	p->val = val;
	p->next = nullptr;
	if (head == nullptr && tail == nullptr) {
		head = tail = p;
		len = 1;
	} else {
		tail->next = p;
		tail = p;
		len++;
	}
}
// 函数功能：析构对象
template <class T>
Queue<T>::~Queue()
{
	if (len > 0) {
		Node *tmp = head;
		while (head != nullptr) {
			tmp = tmp->next;
			delete head;
			head = tmp;
		}
		head = tail = nullptr;
	}
}

#if 0
int main(int argc,const char* argv[])
{
	
	return 0;
}
#endif

